home *** CD-ROM | disk | FTP | other *** search
- #include <Movies.h>
- #include <FixMath.h>
-
- #include "Flippant.h"
-
- // data structures
-
- typedef struct {
- Component victim;
- } FlippantSharedGlobalsRecord, **FlippantSharedGlobalsHandle;
-
- typedef struct{
- ComponentInstance self;
- ComponentInstance delegateComponent;
- ComponentInstance target;
- FlippantSharedGlobalsHandle sharedGlobals;
- UInt32 eventCount;
- } FlippantGlobalsRecord, *FlippantGlobalsPtr;
-
- // dispatcher
-
- #define MC_BASENAME() Flippant
- #define MC_GLOBALS() FlippantGlobalsPtr storage
-
- #define CALLCOMPONENT_BASENAME() MC_BASENAME()
- #define CALLCOMPONENT_GLOBALS() MC_GLOBALS()
-
- #define COMPONENT_UPP_PREFIX() uppMC
- #define COMPONENT_DISPATCH_FILE "FlippantDispatch.h"
- #define COMPONENT_SELECT_PREFIX() kMC
-
- #define GET_DELEGATE_COMPONENT() (storage->delegateComponent)
-
- #include "Components.k.h"
- #include "Movies.k.h"
- #include "ComponentDispatchHelper.c"
-
- // code
-
- pascal ComponentResult FlippantOpen(FlippantGlobalsPtr glob, ComponentInstance self)
- {
- ComponentResult err;
- FlippantSharedGlobalsHandle sharedGlobals;
-
- glob = (FlippantGlobalsPtr)NewPtrClear(sizeof(FlippantGlobalsRecord));
- err = MemError();
- if (noErr != err) goto bail;
-
- SetComponentInstanceStorage(self, (Handle)glob);
- glob->self = self;
- glob->target = self;
-
- sharedGlobals = (FlippantSharedGlobalsHandle)GetComponentRefcon((Component)self);
- if (!sharedGlobals) {
- Component victim;
- ComponentDescription cd;
-
- GetComponentInfo((Component)self, &cd, nil, nil, nil);
- cd.componentManufacturer = kVictimManufacturer;
- cd.componentFlags = 0;
- cd.componentFlagsMask = 0;
- victim = FindNextComponent(nil, &cd);
- if (!victim) {
- DebugStr("\p couldn't find victim!");
- err = paramErr;
- goto bail;
- }
-
- sharedGlobals = (FlippantSharedGlobalsHandle) NewHandleSysClear(sizeof(FlippantSharedGlobalsRecord));
- if (!sharedGlobals) {
- err = MemError();
- goto bail;
- }
- SetComponentRefcon((Component)self, (long)sharedGlobals);
-
- victim = CaptureComponent(victim, (Component)self);
- if (!victim) {
- err = paramErr;
- goto bail;
- }
- (**sharedGlobals).victim = victim;
- }
-
- glob->sharedGlobals = sharedGlobals;
- err = OpenAComponent((**sharedGlobals).victim, &glob->delegateComponent);
- if (err) goto bail;
-
- ComponentSetTarget(glob->delegateComponent, self);
-
- bail:
- return err;
- }
-
- pascal ComponentResult FlippantRegister(FlippantGlobalsPtr glob)
- {
- // If we get this far, we must have been opened successfully, so all is well.
- return noErr;
- }
-
- pascal ComponentResult FlippantUnregister(FlippantGlobalsPtr glob)
- {
- UncaptureComponent((**glob->sharedGlobals).victim);
- DisposeHandle((Handle)glob->sharedGlobals);
- return noErr;
- }
-
- pascal ComponentResult FlippantClose(FlippantGlobalsPtr glob, ComponentInstance self)
- {
- if (glob) {
- if (glob->delegateComponent)
- CloseComponent(glob->delegateComponent);
-
- DisposePtr((Ptr)glob);
- }
-
- return noErr;
- }
-
- pascal ComponentResult FlippantTarget(FlippantGlobalsPtr glob, ComponentInstance target)
- {
- glob->target = target;
- if (glob->delegateComponent)
- ComponentSetTarget(glob->delegateComponent, target);
-
- return noErr;
- }
-
- pascal ComponentResult FlippantVersion(FlippantGlobalsPtr glob)
- {
- return CallComponentVersion(glob->delegateComponent);
- }
-
- static Boolean capsLockIsDown(void)
- {
- KeyMapByteArray keys;
- GetKeys((UInt32*)keys);
- return (keys[7] & 2) ? true : false;
- }
-
- pascal ComponentResult FlippantIsPlayerEvent(FlippantGlobalsPtr glob, const EventRecord *e)
- {
- Boolean okayToFlip = (0 == glob->eventCount++); // only do this once
-
- if (okayToFlip) {
- Movie m = MCGetMovie(glob->delegateComponent);
- if (m) {
- MatrixRecord matrix;
- Rect box;
- GetMovieMatrix(m, &matrix);
- GetMovieBox(m, &box);
-
- if (!EmptyRect(&box)) {
- ScaleMatrix(&matrix, -fixed1, fixed1, (box.right + box.left) * fixed1 / 2, 0);
- SetMovieMatrix(m, &matrix);
- ClearMovieChanged(m); // The "Save changes?" dialog gives the game away...
- }
- }
- }
-
- return MCIsPlayerEvent(glob->delegateComponent, e);
- }
-